package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象---使用率高---实现序列号接口Serializable
 * 功能：将对象转换为二进制
 *                                  版本号：一定要写，对象写出，对象读入，必须同意版本
 *  ObjectOutputStream   对象输出流   写出---Person.java
 *  ObjectInputStream     对象输入流   读入---Person.java
 *
 */
public class ObjectIO {
    //ObjectInputStream  对象输出流/序列化
    //序列化--对象转换为二进制
    //需求：将 Person.java 文件  变成对象 写粗--序列化
    @Test
    public  void testOOS() throws IOException {
        //传输对象：创建对象
        Person p=new Person();
        p.setNames("韩美娟");
        //String[]  say=new String[]{}
        // 字符串数值：动态数组传输--给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
       //传输符合条件对象---输出流---xxx.obj  文件是一种对象文件保存格式
        FileOutputStream fos=new FileOutputStream("person.obj");
        //高级流：ObjectOutputStream
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object  obj)---写出对象
         *作用：将给定对象按照其结构进行转换，转化为一组组字节，再通过处理的流写出
         *抛出异常：   NotSerializableException没有实现序列化接口
         *   原因：传输对象上没有实现Serializable序列化接口
         *
         * Person类---去掉实现序列化接口：Serializable
         *
         * 对象文件写出操作需要经过2个步骤：（专业术语）
         * 1.通过对象输出流将Person类，转换为一组“组”字节这个过程对象序列化
         * 2.将序列化后的字节在通过字节流（低级流）写出到项目中（硬盘上）
         * 做长久的保存，这个过程：数据持久化
         */
        oos.writeObject(p);
        System.out.println("写出成功~");
    }

    /**
     * ObjectInputStream   对象输出流/反序列化
     * 反序列化---二进制转换为对象
     * InvalidClassException  反序列化出现异常：版本号不匹配
     * ClassNotFoundException   没有这个类型异常
     *                          产生原因：读入对象不正确
     *                                  person1.class   person.obj
     *                                  person2.class
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        //创建输入流---person.obj--读入
        FileInputStream fis=new FileInputStream("person.obj");
        //创建高级流---对象输入流
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject()  返回的读取的对象，反序列化操作
        System.out.println(ois.readObject());

    }
}
